//公用API接口模块
import store from '@/store';
import CONFIG from '@/config'; //加载基础配置
import ShowLoading from '@/components/ch-loading/ch-showLoading.js'; //自定义加载动画组件
import ShowToast from '@/components/ch-toast/ch-showtotast.js'; //自定义提示组件
import { decrypt } from "@/utils/common/encrypt.js"; //引入解密方法

//配置API接口，自动切换可用服务
var PATH_TYPE = 0 //接口类型：0 baseUrlWeb，1 baseUrlApp
var BASE_PATH = CONFIG.baseUrlWeb //默认API基础路径
const errorTime = sessionStorage.getItem('network_error_time') || null //获取网络异常时间
if(errorTime){
	if(Date.now() - errorTime < 30 * 60 * 1000){ //30分钟内自动切换
		changeApiPath(PATH_TYPE)
	}else{
		sessionStorage.removeItem('network_error_time') //超时后删除本地记录
	}
}
//其他配置
const device = uni.getSystemInfoSync() //设备信息
//配置默认header
const publicHeader = {
	'client': 'H5',
	'mobileSystem': device.system || '',
	'mobileType': device.model || '',
	'term': 'user'
}
//加载动画初始状态
var isLoading = 0 
//用户IP
window.clientIP = sessionStorage.getItem('user_client_ip') || '127.0.0.1' //IP地址

/**
 * @description 请求拦截
 */
uni.addInterceptor('request', {
	invoke(args) {
		console.log(args);
		//请求地址
		args.url = /^http/.test(args.url) ? args.url : BASE_PATH + args.url
		//请求header
		args.header = args.header ? args.header : {} 
		args.header['X-Access-Token'] = store.state.userToken
		args.header['encrypt'] = args.header.encrypt === 0 ? args.header.encrypt : 1
		args.header = Object.assign(args.header, publicHeader, {'clientIP': window.clientIP || '127.0.0.1'})
	},
	success(response, params) {
		console.log(response);
		if(response.statusCode == 200 && response.data.code != 401){
			if(params.header.encrypt !== 0 && response.data.result && typeof(response.data.result) != "object"){
				try{//尝试解密
					let jsonStr = decrypt(response.data.result)
					if(jsonStr){
						jsonStr = jsonStr.replace(/\u0000/g, "") // eslint-disable-line
						response.data.result = JSON.parse(jsonStr)
					}
				}catch(e){//数据解密错误
					console.log(e);
				}
			}
		}
	},
	fail(err) {
		console.log('request-fail', err)
		uni.getNetworkType({
			success: (data) => {
				console.log(data.networkType);
				if(data.networkType != 'none'){
					//失败提示，此处可以引导用户下载APP
					ShowToast({text: '服务异常，请稍后重试', type: 2})
					sessionStorage.setItem('network_error_time', Date.now())
					changeApiPath(PATH_TYPE)
				}else{
					//失败提示
					ShowToast({text: '网络异常，请检查您的网络', type: 2})
				}
			}
		});
	}, 
	complete() {
		console.log(isLoading);
		isLoading -= 1
		if(isLoading <= 0){
			ShowLoading({show: false}) //关闭加载中
			isLoading = 0
		}
	}
});

/**
 * @description 修改接口
 * @param {Number} type - 当前接口路径类型：[0|1]
 */
function changeApiPath(type) {
	if(type === 0){
		PATH_TYPE = 1
		BASE_PATH = CONFIG.baseUrlApp
	}
}

/**
 * @description http请求基础封装对象，支持get、post
 * @property {Function} get GET请求
 * @property {Function} post Post请求
 */
const http = {
	/**
	 * @description get请求
	 * @param {object} options - 请求参数对象
	 * - @param {String} options.url - 接口URL
	 * - @param {object} [options.data] - 请求参数Data
	 * - @param {object} [options.header] - 请求头header
	 * - @param {Boolean} [options.noCheck] = [true|false] - 请求是否检查登录状态
	 * - @param {Boolean} [options.noLoading] = [true|false] - 请求是否显示loading
	 * @returns {object} data
	 */
	get: function(options = {}) {
		isLoading += 1 //更新状态
		if(!options.noLoading){//判断是否需要显示加载动画
			ShowLoading({show: isLoading}) //显示加载中
		}
		options.header = options.header ? options.header : {}
		options.header['Content-Type'] = options.header['Content-Type'] ? options.header['Content-Type'] : 'application/x-www-form-urlencoded'
		return new Promise((resolve,reject)=>{
			//调用uni request请求
			uni.request({
				url: options.url,
				method: 'GET',
				data: options.data || {}, //请求数据
				header: options.header || {},
				success: (res)=> {
					if(res.statusCode === 200 || res.statusCode === 401){
						if(options.noCheck !== true && res.data.code == 401){//判断token失效是否跳转
							store.dispatch("redirectLogin") //跳转登录
							reject(res)
						}else{
							//成功返回数据
							resolve(res.data)
						}
					}else{
						reject(res)
					}
				},
				fail: (res) => {
					//返回错误信息
					reject(res)
				}
			})
		})
	},
	/**
	 * @description post请求
	 * @param {object} options - 请求参数对象
	 * - @param {String} options.url - 接口URL
	 * - @param {object} [options.data] - 请求参数Data
	 * - @param {object} [options.header] - 请求头header
	 * - @param {Boolean} [options.noCheck] = [true|false] - 请求是否检查登录状态
	 * - @param {Boolean} [options.noLoading] = [true|false] - 请求是否显示loading
	 * @returns {object} data
	 */
	post: function(options={}){
		isLoading += 1 //更新状态
		if(!options.noLoading){//判断是否需要显示加载动画
			ShowLoading({show: isLoading}) //显示加载中
		}
		options.header = options.header ? options.header : {}
		options.header['Content-Type'] = options.header['Content-Type'] ? options.header['Content-Type'] : 'application/json'
		return new Promise((resolve,reject)=>{
            //调用uni request请求
			uni.request({
				url: options.url,
				method: 'POST',
				data: options.data || {}, //请求数据
				header: options.header || {},
				success: (res)=> {
					if(res.statusCode === 200 || res.statusCode === 401){
						if(options.noCheck !== true && res.data.code == 401){//判断token失效是否跳转
							store.dispatch("redirectLogin") //跳转登录
							reject(res)
						}else{
							//成功返回数据
							resolve(res.data)
						}
					}else{
						reject(res)
					}
				},
				fail: (res) => {
					//返回错误信息
					reject(res)
				}
			})
		})
	}
	//delete, put已删除
}

export default http